#ifndef __pika_hal_cirQueue_H__
#define __pika_hal_cirQueue_H__

#include "PikaObj.h"
#include "pika_platform_thread.h"

//类型为void*的队列
#if 1
// 定义循环指针队列的结构体
typedef struct pika_hal_cirQueue {
    void** buffer;  // 存储元素的缓冲区
    size_t head;    // 队头指针
    size_t tail;    // 队尾指针
    size_t count;   // 当前元素数量
    size_t capacity; // 缓冲区容量
#if PIKA_HAL_CIRCULAR_QUEUE_MUTEX_ENABLE
    pika_platform_thread_lock_t mutex;  // 互斥锁
#endif
} pika_hal_cirQueue;

// 创建一个新的循环指针队列
pika_hal_cirQueue* pika_hal_cirQueue_create(size_t capacity);

// 向队列中添加一个元素
size_t pika_hal_cirQueue_appendHead(pika_hal_cirQueue* cb, void* value);
size_t pika_hal_cirQueue_appendTail(pika_hal_cirQueue* cb, void* value);
// 从队列中移除一个元素
size_t pika_hal_cirQueue_popHead(pika_hal_cirQueue* cb, void** value);
size_t pika_hal_cirQueue_popTail(pika_hal_cirQueue* cb, void** value);


// 销毁队列并释放相关资源
size_t pika_hal_cirQueue_deinit(pika_hal_cirQueue* cb);

// 获取队列中的元素数量
size_t pika_hal_cirQueue_getCount(pika_hal_cirQueue* cb);

// 检查队列是否为空
size_t pika_hal_cirQueue_isEmpty(pika_hal_cirQueue* cb);

// 检查队列是否已满
size_t pika_hal_cirQueue_isFull(pika_hal_cirQueue* cb);
#endif //类型为void*的队列

//类型为char的队列
#if 1
typedef struct pika_hal_cirQueueByte {
    char* buffer;  // 存储元素的缓冲区
    size_t head;   // 队头指针
    size_t tail;   // 队尾指针
    size_t count;  // 当前元素数量
    size_t capacity; // 缓冲区容量
#if PIKA_HAL_CIRCULAR_QUEUE_MUTEX_ENABLE
    pika_platform_thread_lock_t mutex;  // 互斥锁
#endif
} pika_hal_cirQueueByte;

// 创建一个新的循环字符队列
pika_hal_cirQueueByte* pika_hal_cirQueueByte_create(size_t capacity);

// 向队列头部添加一个字符
size_t pika_hal_cirQueueByte_appendHead(pika_hal_cirQueueByte* cb, char value);

// 向队列尾部添加一个字符
size_t pika_hal_cirQueueByte_appendTail(pika_hal_cirQueueByte* cb, char value);

// 从队列头部移除一个字符
size_t pika_hal_cirQueueByte_popHead(pika_hal_cirQueueByte* cb, char* value);

// 从队列尾部移除一个字符
size_t pika_hal_cirQueueByte_popTail(pika_hal_cirQueueByte* cb, char* value);

// 查看队列头部的字符但不移除
size_t pika_hal_cirQueueByte_peekHead(pika_hal_cirQueueByte* cb, char* value);

// 查看队列尾部的字符但不移除
size_t pika_hal_cirQueueByte_peekTail(pika_hal_cirQueueByte* cb, char* value);

// 销毁队列并释放相关资源
size_t pika_hal_cirQueueByte_deinit(pika_hal_cirQueueByte* cb);

// 获取队列中的元素数量
size_t pika_hal_cirQueueByte_getCount(pika_hal_cirQueueByte* cb);

// 检查队列是否为空
size_t pika_hal_cirQueueByte_isEmpty(pika_hal_cirQueueByte* cb);

// 检查队列是否已满
size_t pika_hal_cirQueueByte_isFull(pika_hal_cirQueueByte* cb);


#endif //类型为char的队列


#endif  // end of file